package com.example.kotlintest

import com.example.utils.*
import java.util.*

/**
 * 新的方法声明按照栈进行，省的往下划动太多
 * 新的方法调用，就在main方法体后换个行，也写在顶部吧
 *
 */
fun main() {
    funDefaultParamTest()
//    println(dayOfWeek())
//    loop()
//    funWhen()
//    arrayTest()
//    stringTemplete()
//    funRange()
}

/**
 * 带默认值的方法测试
 *
 */
fun funDefaultParamTest(){
    funDefaultParam()
    line()
    funDefaultParam("传参调用funDefaultParam了，我是参数，即输出")
}
/**
 * 带有默认参数的方法
 * 不传参数时，使用默认值
 * @param str String
 */
fun funDefaultParam(str:String="我是带有默认值的方法，调用我可以不写参数"){
    println(str)
}
/**
 * 今天是周几
 * @return String
 */
fun dayOfWeek(): String {
    var currentDay=""
    var calendar = Calendar.getInstance();
    calendar.setTime(Date());
    var weekIdx = calendar.get(Calendar.DAY_OF_WEEK) - 1


    when (weekIdx) {
        1 -> { currentDay="周一"}
        2 -> { currentDay="周二"}
        3 -> { currentDay="周三"}
        4 -> { currentDay="周四"}
        5 -> { currentDay="周五"}
        6 -> { currentDay="周六"}
        7 -> { currentDay="周日"}
        else -> {
            currentDay="日期错误"
        }
    }

    return currentDay
}

fun loop() {
    var ints = arrayListOf<Int>(1, 0, 6, 9)
//    return是用到方法中
    ints.forEach each@{
        if (it == 0) return@each
        print(it)
    }
    println()
    lineWave()
//    break和continue是用在loop中的
    for (int in ints) {
        if (int == 0) continue
        print(int)
    }
    println()
}

fun funWhen() {
    var x = 1;
    //变量
    when (x) {
        1 -> println("x == 1")
        2 -> println("x == 2")
        else -> { // 注意这个块
            println("x 不是 1 ，也不是 2")
        }
    }
    //表达式
    when (x) {
        0, 1 -> println("x == 0 or x == 1")
        else -> println("otherwise")
    }
    //逻辑运算
    when (x) {
        in 1..10 -> println("x is in the range")
        !in 10..20 -> println("x is outside the range")
        else -> println("none of the above")
    }
    fun hasPrefix(x: Any) = when (x) {
        is String -> x.startsWith("prefix")
        is Number -> "$x is Number"
        else -> false
    }
    println(hasPrefix(x))


}

/*
数组array
 */
fun arrayTest() {
    println("数组测试")
    var array = arrayOf(1, 2, 3)

    if (array.lastIndex >= 0) {
        println(array[array.lastIndex])
    }
    println(array.get(0))
//    修改了下标为0时的值
    array.set(0, 0)
    print("修改下标后的值：")
    for (i in array) {
        print(i)
    }
    println()

    array = emptyArray();
    println("初始化 空数组 了")
    if (array.lastIndex == 0) {
        println("array为空")
    }

    var arrayString = arrayOf<String>("hello", "world")
    arrayString.forEach {
        print(" $it")
    }
    println()
}

/*
字符串末班
 */
fun stringTemplete() {
    line()
    var str = "abc"
    println("$str 的length为 ${str.length}")
/*
    高兴的过早了，本来试验了java的soutv就觉得kotlin也是一样的
    java的soutv，先soutv再输入变量，或则 变量.soutv 都可以
    但kotlin的soutv只能先soutv再输入变量，不能 变量.soutv
    相比之下，变量.soutv 一步到位也最方便

    改kotlin的liveTemplate无效
    改postfix Template,kotlin直接不允许添加
    然后网上找了custom postfix Template 插件 试着去实现

    直接把liveTemplate里的模板拿来，
    println("$EXPR_COPY$ = $DOLLAR${$EXPR$}"),
    没法正常用

    参考了模板和网上的博客，
    解决了kotlin\user.postfixTemplate 无法输入 $ 的问题
    $DOLLAR$无法转义为输出的$,然后试着用 \n 转义字符的方式，
    println("$expr$ = \${$expr$}")
    成了

    完整模板
    .soutv : 输出变量名和变量值格式的字符串
	ANY  →  println("$expr$ = \${$expr$}")
    */
    println("str = ${str}")
}

/**
 * Fun range 区间测试
 *
 */
fun funRange() {
//    for循环
    println("for循环:")
    for (i in 1..5) {
        print(" $i")
    }
    line()
    println("\n")

//    if
    var j = 2;
    if (j in 1..5) {
        println("1..5包含$j")
    }
    if (j !in 6..10) {
        println("6..10不包含$j")
    }
    lineStar()
//    步长step
    for (i in 1..5 step 2) {
        println(i)
    }
    lineSharp()
//    util直到，range默认闭区间，until开区间
    for (i in 1 until 5) {
        println(i)
    }
    lineWave()
    //downTo降区间
    for (i in 10 downTo 5 step 2) {
        println(i)
    }

}



